Consul 的使用、集群注册与消费简单案例

作者: 李多多 日期: 2020-07-02
Spring Cloud
Consul 的使用、集群注册与消费简单案例

1.Consul 使用

首先创建一个服务提供者 consul-provider。新建一个 Spring Boot 项目,添加如下依赖:

image.png

项目创建成功后,application.properties 添加如下配置:

spring.application.name=consul-provider
server.port=2000
# Consul 相关配置
spring.cloud.consul.host=192.168.1.111 #写自己的ip
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=consul-provider
spring.cloud.consul.discovery.heartbeat.enabled=true

项目启动类上面开启服务发现功能:

@SpringBootApplication
@EnableDiscoveryClient //开启服务发现的功能
public class ConsulProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulProviderApplication.class, args);
}

}

最后创建测试接口:

@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}

启动项目,访问 consul 后台管理页面,看到如下信息,表示已经成功。

image.png

2. Consul 集群注册

为了区分集群中的哪一个 provider 提供的服务,修改一下 consul 的接口:

@RestController
public class HelloController {

@Value("${server.port}")
Integer port;

@GetMapping("/hello")
public String hello(){
return "hello>>"+port;
}
}

然后对项目进行打包,命令行执行下列命令,启动两个 provider 实例:

java -jar consul-provider-0.0.1-SNAPSHOT.jar --server.port=2000
java -jar consul-provider-0.0.1-SNAPSHOT.jar --server.port=2001

启动成功后,再去访问 consul 后台管理页面,就可以看到两个实例了:

image.png

3. 消费

首先创建一个消费实例 consul-consumer,和 provider 一致。

创建成功后,添加如下配置:

spring.application.name=consul-consumer
server.port=2002
spring.cloud.consul.host=192.168.1.111
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=consul-consumer
spring.cloud.consul.discovery.heartbeat.enabled=true

开启服务发现,并添加 RestTemplate:

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulConsumerApplication {

public static void main(String[] args) {
SpringApplication.run(ConsulConsumerApplication.class, args);
}

@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
}

最后,提供调用方法:

@RestController
public class HelloController {

//这里通过 loadBalancerClient 实例,可以获取要调用的 ServiceInstance, 获取到调用地址后再 用 RestTemplate 去调用。
@Autowired
LoadBalancerClient loadBalancerClient;

@Autowired
RestTemplate restTemplate;

@GetMapping("/hello")
public void hello(){
ServiceInstance choose = loadBalancerClient.choose("consul-provider");
System.out.println("服务地址:"+ choose.getUri());
System.out.println("服务名称:"+choose.getServiceId());
String s = restTemplate.getForObject(choose.getUri()+"/hello", String.class);
System.out.println(s);
}
}

最后启动项目,浏览器输入: http://localhost:2002/hello 查看结果,这个请求自带负载均衡功能。

项目示例地址:https://github.com/astronger/springcloud-simple-samples